package com.lynn.lib_base.ui

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider

abstract class BaseFragment<VDB : ViewDataBinding, VM : BaseViewModel>(private val layoutResId: Int) :
    Fragment(), IBaseView {

    open var mBinding: VDB? = null
    open var mViewModel: VM? = null

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        initParam()

        // 初始化 ViewDataBinding（根据 layoutResId 布局文件自动生成的）
        mBinding = DataBindingUtil.inflate<VDB>(inflater,layoutResId,container,false)
        // 初始化ViewModel 实例
        mViewModel = initViewModel()
        // 设置数据
        setData()
        // 在Android开发中的作用是将当前Activity或Fragment的生命周期与DataBinding绑定，
        // 确保LiveData对象能够感知生命周期的变化，从而在UI更新时不会导致内存泄漏或无效的UI更新。
        // 具体作用
        // 感知生命周期变化‌：通过调用binding.setLifecycleOwner(this);，DataBinding能够感知到当前Activity或Fragment的生命周期变化。这意味着当Activity或Fragment被销毁时，绑定的LiveData对象也会相应地被清理，避免内存泄漏。
        // 自动更新UI‌：当LiveData对象中的数据发生变化时，如果设置了LifecycleOwner，DataBinding会自动更新绑定的视图，确保UI与数据保持同步。
        mBinding?.lifecycleOwner = this

        initView(savedInstanceState)

        // 初始化页面观察者的监听
        initViewObservable()
        return mBinding?.root
    }

    abstract fun initView(bundle: Bundle?)

    abstract fun setData()

    /**
     * 1、初始化
     *   viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
     */
    abstract fun initViewModel(): VM


    override fun onDestroyView() {
        super.onDestroyView()
    }

}
